﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using service_desk_blred.Utils;
using MySql.Data.MySqlClient;
using System.Web.Mvc;

namespace service_desk_blred.Models
{
    #region Models
    public class EmpresaModel
    {

        public int IdEmpresa { get; set; }

        [Required(ErrorMessage = "O Campo Razão Social é obrigatório!")]//Este campo deve ter um limite alto, pois temos um cliente mais ou menos assim:
        [DisplayName("Razão Social*")]                                      //PROVÍNCIA BRASILEIRA DA CONGREGAÇÃO DAS IRMÃS FILHAS DA CARIDADE DE SÃO VICENTE DE PAULO. haha
        public string RazaoSocial { get; set; }

        [DisplayName("Nome Fantasia*")]
        public string NomeFantasia { get; set; }

        [Required(ErrorMessage = "O Campo CNPJ é obrigatório!")] //XX.XXX.XXX/XXXX-XX
        [DisplayName("CNPJ*")]
        public string Cnpj { get; set; }

        [DisplayName("Inscrição Estadual Isenta")]
        public Boolean InscEstadual { get; set; }

        [Required(ErrorMessage = "O Campo Endereço é obrigatório!")]
        [DisplayName("Endereço*")]
        public string Endereco { get; set; }

        [Required(ErrorMessage = "O Campo Número é obrigatório!")]
        [DisplayName("Número*")]
        public string NumEndereco { get; set; }

        [DisplayName("Complemento")]
        public string complEndereco { get; set; }

        [Required(ErrorMessage = "O Campo Bairro é obrigatório!")]
        [DisplayName("Bairro*")]
        public string Bairro { get; set; }

        [Required(ErrorMessage = "O Campo Cidade é obrigatório!")]
        [DisplayName("Cidade*")]
        public string Cidade { get; set; }

        [Required(ErrorMessage = "O Campo Estado é obrigatório!")]
        [DisplayName("Estado*")]
        public string Estado { get; set; }

        public List<SelectListItem> ListaEstados { get; set; }

        [Required(ErrorMessage = "O Campo CEP é obrigatório!")] //XX.XXX-XXX
        [DisplayName("CEP*")]
        public string CEP { get; set; }

        [Required(ErrorMessage = "O Campo Telefone é obrigatório!")] //+XX (XX) XXXX-XXXX
        [DisplayName("Telefone*")]
        public string Telefone { get; set; }

        [DisplayName("FAX")] //+XX (XX) XXXX-XXXX
        public string Fax { get; set; }

        [DisplayName("Web Site")]
        public string Site { get; set; }

        [Required(ErrorMessage = "O Campo E-mail de Contato é obrigatório!")]
        [DisplayName("E-mail de Contato*")]
        public string Mail { get; set; }

        [Required(ErrorMessage = "O Campo E-mail para envio de Nota Fisca Eletronica é obrigatório!")]
        [DisplayName("E-mail para envio de Nota Fisca Eletronica*")]
        public string MailNf { get; set; }

        [DisplayName("Informações Adicionais")]
        public string InformacoesAdicionais { get; set; }

    }
    #endregion

    #region Service

    public class EmpresaService
    {


        public ResponseInfo CadastrarEmpresa(EmpresaModel model)
        {

            String command = "INSERT INTO EMPRESA (NOME_FANTASIA,RAZAO_SOCIAL,CNPJ,INSC_ISENTA,CEP,ENDERECO,NUMERO,COMPLEMENTO,CIDADE,BAIRRO,TELEFONE,FAX,EMAIL,EMAIL_NF,SITE,INFORMACOES_ADICIONAIS,ID_ESTADO) "
                           + "VALUES (@nomeEmpresa, @razaoSocial, @cnpj, @inscIsenta, @cep, @endereco, @numero, @complemento, @cidade, @bairro, @telefone, @fax, @email, @emailNf, @site, @informacoesAdicionais, @idEstado)";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@nomeEmpresa", model.NomeFantasia);
            cmd.Parameters.AddWithValue("@razaoSocial", model.RazaoSocial);
            cmd.Parameters.AddWithValue("@cnpj", model.Cnpj);
            cmd.Parameters.AddWithValue("@inscIsenta", model.InscEstadual);
            cmd.Parameters.AddWithValue("@cep", model.CEP);
            cmd.Parameters.AddWithValue("@endereco", model.Endereco);
            cmd.Parameters.AddWithValue("@numero", model.NumEndereco);
            cmd.Parameters.AddWithValue("@complemento", model.complEndereco);
            cmd.Parameters.AddWithValue("@cidade", model.Cidade);
            cmd.Parameters.AddWithValue("@bairro", model.Bairro);
            cmd.Parameters.AddWithValue("@telefone", model.Telefone);
            cmd.Parameters.AddWithValue("@fax", model.Fax);
            cmd.Parameters.AddWithValue("@email", model.Mail);
            cmd.Parameters.AddWithValue("@emailNf", model.MailNf);
            cmd.Parameters.AddWithValue("@site", model.Site);
            cmd.Parameters.AddWithValue("@informacoesAdicionais", model.InformacoesAdicionais);
            cmd.Parameters.AddWithValue("@idEstado", model.Estado);

            try
            {

                if (DataBase.ExecuteNonQuery(cmd) != 0)
                {
                    return new ResponseInfo(ResponseEntity.Sucesso);
                }
                else
                {
                    return new ResponseInfo(ResponseEntity.Erro, "Não foi possível realizar está operação.");
                }

            }

            catch (Exception e)
            {
                return new ResponseInfo(ResponseEntity.Erro, e.Message);
            }



        }

        public ResponseInfo update(EmpresaModel model)
        {
            return new ResponseInfo(ResponseEntity.Sucesso);
        }

        public ResponseInfo excluir(EmpresaModel model)
        {
            String command = "DELETE FROM EMPRESA WHERE ID_EMPRESA LIKE @idEmpresa";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@idEmpresa", model.IdEmpresa);

            try
            {

                if (DataBase.ExecuteNonQuery(cmd) != 0)
                {
                    return new ResponseInfo(ResponseEntity.Sucesso);
                }
                else
                {
                    return new ResponseInfo(ResponseEntity.Erro, "Não foi possível realizar está operação.");
                }

            }

            catch (Exception e)
            {
                return new ResponseInfo(ResponseEntity.Erro, e.Message);
            }


        }

        public ResponseInfo recuperarTodos()
        {
            String command = "SELECT * FROM empresa";

            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;

            MySqlConnection conn = DataBase.createConnection();
            conn.Open();
            cmd.Connection = conn;

            using (MySqlDataReader dr = cmd.ExecuteReader())
            {
                List<EmpresaModel> empresas = new List<EmpresaModel>();

                while (dr.Read())
                {
                    EmpresaModel model = new EmpresaModel();

                    model.IdEmpresa = dr.GetInt32("ID_EMPRESA");
                    model.RazaoSocial = dr.GetString("RAZAO_SOCIAL");
                    model.NomeFantasia = dr.GetString("NOME_FANTASIA");
                    model.Cnpj = dr.GetString("CNPJ");
                    model.InscEstadual = dr.GetBoolean("INSC_ISENTA");
                    model.CEP = dr.GetString("CEP");
                    model.Endereco = dr.GetString("ENDERECO");
                    model.Cidade = dr.GetString("CIDADE");
                    model.Bairro = dr.GetString("BAIRRO");
                    model.Telefone = dr.GetString("TELEFONE");
                    model.Fax = dr.GetString("FAX");
                    model.Mail = dr.GetString("EMAIL");
                    model.MailNf = dr.GetString("EMAIL_NF");
                    model.Site = dr.GetString("SITE");
                    model.InformacoesAdicionais = dr.GetString("INFORMACOES_ADICIONAIS");
                    model.Estado = dr.GetString("ID_ESTADO");

                    empresas.Add(model);
                }

                DataBase.closeConnection(conn);

                return new ResponseInfo(ResponseEntity.Sucesso, "", empresas);
            }

        }

        public ResponseInfo recuperarPorId(int id)
        {
            String command = "SELECT * FROM EMPRESA WHERE ID_EMPRESA = @idEmpresa ";


            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = command;
            cmd.Parameters.AddWithValue("@idEmpresa", id);

            MySqlConnection conn = DataBase.createConnection();
            conn.Open();
            cmd.Connection = conn;

            using (MySqlDataReader dr = cmd.ExecuteReader())
            {

                EmpresaModel model = new EmpresaModel();

                while (dr.Read())
                {
                    model.IdEmpresa = dr.GetInt32("ID_EMPRESA");
                    model.RazaoSocial = dr.GetString("RAZAO_SOCIAL");
                    model.NomeFantasia = dr.GetString("NOME_FANTASIA");
                    model.Cnpj = dr.GetString("CNPJ");
                    model.InscEstadual = dr.GetBoolean("INSC_ISENTA");
                    model.CEP = dr.GetString("INCEPSC_ISENTA");
                    model.Endereco = dr.GetString("CEP");
                    model.Cidade = dr.GetString("CIDADE");
                    model.Bairro = dr.GetString("BAIRRO");
                    model.Telefone = dr.GetString("TELEFONE");
                    model.Fax = dr.GetString("FAX");
                    model.Mail = dr.GetString("EMAIL");
                    model.MailNf = dr.GetString("EMAIL_NF");
                    model.Site = dr.GetString("SITE");
                    model.InformacoesAdicionais = dr.GetString("INFORMACOES");
                    model.Estado = dr.GetString("ID_ESTADO");

                    break;
                }

                DataBase.closeConnection(conn);

                return new ResponseInfo(ResponseEntity.Sucesso, "", model);
            }

        }


    }


    #endregion

}
